package br.unicamp.ic.sgct.client.apresentacao.ucs;

import br.unicamp.ic.sgct.client.aplicacao.conferencia.ConferenciaListener;
import br.unicamp.ic.sgct.client.apresentacao.views.ViewDadosConferencia;
import br.unicamp.ic.sgct.client.apresentacao.views.ViewListaConferencia;
import br.unicamp.ic.sgct.client.dominio.to.ConferenciaTO;
import com.google.gwt.event.logical.shared.SelectionEvent;
import com.google.gwt.event.logical.shared.SelectionHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.DecoratedTabPanel;
import java.util.List;

public class ConferenciaScreen extends BaseConferenciaScreen {

    private ConferenciaListener controladoraConferencia = null;
    private ConferenciaTO conferencia = null;
    private ViewDadosConferencia viewDadosConferencia = new ViewDadosConferencia("Dados Confer\u00eancia", 1);
    private ViewListaConferencia viewListaConferencia = new ViewListaConferencia("Confer\u00eancias Abertas", 0,
            new ViewListaConferencia.HandlerClickListaConferencia() {

                @Override
                public void handle(ConferenciaTO to) {
                    showLoading(true);
                    controladoraConferencia.obterConferencia(to.getId(), new ConferenciaListener.HandlerObterConferencia() {

                        @Override
                        public void handleSucesso(ConferenciaTO to) {
//                        	Window.alert("Atividade 1 \n " +
//                        			"  Implementar aqui:\n"+
//                        			"   1 - conferencia = to\n"+
//                        			"   2 - viewDadosConferencia.montar(conferencia)\n" +
//                        			"   3 - panelTabOpcoes.selectTab(1)\n" +
//                        			"   4 - showLoading(false)\n\n" +
//                        			" Questoes\n" +
//                        			"	1 - Quem chama o metodo handleSucesso de HandlerObterConferencia ?\n" +
//                        			"	2 - Quem chama o metodo handle de HandlerClickListaConferencia ?\n" +
//                        			"	3 - ConferenciaListener.HandlerObterConferencia eh classe ou interface?\n\n" +
//                        			"Obs:\n"+
//                        			" 1 - Na classe ConferenciaScreen ha um atributo do tipo ViewListaConferencia\n" +
//                        			" 2 - O construtor de ViewListaConferencia contem parametro do tipo HandlerClickListaConferencia\n" +
//                        			" 3 - Na implementacao do metodo handle de HandlerClickListaConferencia ha chamada p/ o metodo obterConferencia de ConferenciaListener\n" +
//                        			" 4 - O metodo obterConferencia de ConferenciaListener contem parametro do tipo HandlerObterConferencia\n" );

                            conferencia = to;
                            viewDadosConferencia.montar(conferencia);
                            panelTabOpcoes.selectTab(1);
                            showLoading(false);
                        }

                        @Override
                        public void handleErro(Throwable caught) {
                            controladoraConferencia.setMensagemErro("ConferenciaScreen.viewListaConferencia " + caught.getMessage());
                            showLoading(false);
                        }
                    });
                }
            });

    public ConferenciaScreen(final ConferenciaListener controladora) {
        super();
        this.controladoraConferencia = controladora;
        this.initWidget(super.initPanel(controladora));
        showLoading(true);
        controladora.getMensagemWidget().limparMensagem();
        controladora.listarConferenciasAbertas(new ConferenciaListener.HandlerListarConferenciasAbertas() {

            @Override
            public void handleSucesso(List<ConferenciaTO> listTo) {
                if (listTo.isEmpty()) {
                    controladoraConferencia.setMensagemErro("N\u00e3o há confer\u00eancia abertas");
                } else {
                    viewListaConferencia.montar(listTo);
                }
                showLoading(false);
            }

            @Override
            public void handleErro(Throwable caught) {
                controladora.setMensagemErro("ConferenciaScreen " + caught.getMessage());
                showLoading(false);
            }
        });

    }

    @Override
    public void load() {
        this.controladoraConferencia.getMensagemWidget().limparMensagem();
        this.panelTabOpcoes.selectTab(0);
    }

    @Override
    protected DecoratedTabPanel initPanelTabOpcoes() {
        panelTabOpcoes = new DecoratedTabPanel();
        panelTabOpcoes.add(viewListaConferencia, viewListaConferencia.getStrTabTitle());
        panelTabOpcoes.add(viewDadosConferencia, viewDadosConferencia.getStrTabTitle());
        viewDadosConferencia.getStrTabTitle().setVisible(false);
        panelTabOpcoes.selectTab(0);
        panelTabOpcoes.setWidth("750px");
        panelTabOpcoes.setAnimationEnabled(true);
        panelTabOpcoes.addSelectionHandler(new SelectionHandler() {

            @Override
            public void onSelection(SelectionEvent event) {
                Integer item = (Integer) event.getSelectedItem();
                if (item == 0) {
                    conferencia = null;
                    viewDadosConferencia.getStrTabTitle().setVisible(false);
                } else {
                    if (item == 1) {
                        if (conferencia == null) {
                            panelTabOpcoes.selectTab(0);
                            controladoraConferencia.setMensagemErro("Selenione uma Confer\u00eancia");
                        } else {
                            viewDadosConferencia.getStrTabTitle().setVisible(true);
                        }
                    }
                }

            }
        });
        return panelTabOpcoes;
    }
}
